{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：如何使用 pandas 聚集和重组数据？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "聚集重组算是 pandas 的一个比较重要的内容，对数据集进行分类并将数据处理函数应用于每个组，通常是数据分析工作流的关键组成部分。pandas 提供了灵活的 groupby 接口，能够更加轻松地对数据集进行切片，切块和汇总。\n",
    "\n",
    "答案\n",
    "使用 groupby 将 pandas 对象分组，再对子组进行调用聚合函数。\n",
    "\n",
    "拓展\n",
    "pandas的聚集和重组数据（group by）通常会涉及三件事：拆分-应用-合并（split-apply-combine）。\n",
    "\n",
    "图片描述\n",
    "\n",
    "拆分（split）：按一定的条件将 pandas 对象分组；\n",
    "应用（apply）：分别对每组施行函数计算；\n",
    "合并（combine）：整合所有组的计算结果。\n",
    "在第一步中，拆分会将 pandas 对象分组，然后返回一个 GroupBy 对象。和拆分（split）相比，应用（apply）阶段就稍微要复杂一点，apply 将被操纵的对象分割为多个部分，在每个部分上调用传递的函数，然后尝试将各个部分连接在一起。所以，你可以在这个步骤做：\n",
    "\n",
    "聚合（aggregation）：计算每组的统计数值，比如总和(sum)，均值(mean)等；\n",
    "转换（transformation）：将新的组合数据进行整型，比如填充缺失值，数据标准化等；\n",
    "过滤（filtration）：丢弃一些不必要的数据。\n",
    "In [8]: people = pd.DataFrame(np.random.randn(5,5),\n",
    "   ...: columns=['a','b','c','d','e'],\n",
    "   ...: index=['Jone','Steve','Wes','Jim','Travis'])\n",
    "\n",
    "In [9]: people.iloc[2:3,[1,2]]= np.nan\n",
    "\n",
    "In [10]: people\n",
    "Out[10]:\n",
    "               a         b         c         d         e\n",
    "Jone   -0.180013  1.623050  0.493488  0.097628  0.878426\n",
    "Steve  -1.229319 -1.461898  0.414394  0.173925  0.793595\n",
    "Wes     1.584163       NaN       NaN -1.106286  1.192162\n",
    "Jim    -0.168301 -0.692428  1.009714  0.185504 -0.648086\n",
    "Travis  0.670818  0.242784 -0.947095 -0.627370 -0.870376\n",
    "\n",
    "In [11]: mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}\n",
    "\n",
    "In [12]: by_column = people.groupby(mapping, axis=1)\n",
    "\n",
    "In [13]: by_column\n",
    "Out[13]: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x116378250>\n",
    "\n",
    "In [14]: by_column.sum() # 或使用 by_column.aggregate(np.sum)\n",
    "Out[14]:\n",
    "            blue       red\n",
    "Jone    0.591116  2.321464\n",
    "Steve   0.588319 -1.897622\n",
    "Wes    -1.106286  2.776325\n",
    "Jim     1.195218 -1.508815\n",
    "Travis -1.574465  0.043226\n",
    "\n",
    "In [15]: by_column.get_group('red')\n",
    "Out[15]:\n",
    "               a         b         e\n",
    "Jone   -0.180013  1.623050  0.878426\n",
    "Steve  -1.229319 -1.461898  0.793595\n",
    "Wes     1.584163       NaN  1.192162\n",
    "Jim    -0.168301 -0.692428 -0.648086\n",
    "Travis  0.670818  0.242784 -0.870376\n",
    "pandas 的聚集和重组数据就有点像 SQL，但是比 SQL 要好理解一些。掌握 pandas 的数据分组工具可以帮助进行数据清理以及建模或统计分析工作，其它更多的分组用法可以参考官方文档。\n",
    "\n",
    "小结\n",
    "会熟练使用常用的数据分析库 numpy，pandas，matplotlib 等，是数据分析面试的一个重要的考核点，另外，使用 ipython 探索数据也是一个数据分析师的日常。所以，希望大家在私下多用 ipython 学习使用这些库，这些库都是相当成熟的库，有大量的人在维护，文档也非常完善，所以，官方文档是最好的答疑助手。当然，数据分析还少不了数据，大家可以从awesome-public-datasets找到一些感兴趣的数据，它收集的数据所在领域比较广泛，收录政府、金融、计算机网络、软件、体育、气候天气等30个领域的数据。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}